home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
misc
/
emu
/
Apex-src.lha
/
XDUP.XPL
< prev
next >
Wrap
Text File
|
2001-09-30
|
3KB
|
141 lines
\XDUP.XPL FEB-17-89
\Disk duplicator via Xmodem.
\REVISION HISTORY:
\FEB-17-89, Fixed bug where sending computer hangs, added comments.
code RESERVE=3, CHIN=7, CHOUT=8, CRLF=9,
INTIN=10, INTOUT=11, TEXT=12, OPENI=13,
OPENO=14, CLOSE=15, FREE=18, FWRITE=30,
FREAD=31;
def TV=0, KB=0; \Device numbers
int UNIT, \Unit involved in transfer
SIZE0, \Size of BUFFER in blocks
BLOCKS, \Total number of blocks to transfer
RECEIVING; \Flag: This is the receiving computer
addr BUFFER; \Array: buffer space
func VERIFY; \Return 'TRUE' if "Y" (or "y") is typed in
begin
TEXT(TV, " - ARE YOU SURE (N/Y)? ");
OPENI(KB);
return (CHIN(KB)!$20) = ^y;
end; \VERIFY
proc XGET(BUFFER, SIZE); \Receive buffer from Xmodem device
addr BUFFER;
int SIZE; \Size of BUFFER in blocks
int I;
begin
for I:= 0, SIZE *256 -1 do
BUFFER(I):= CHIN(5);
end; \XGET
proc XSEND(BUFFER, SIZE); \Send buffer to Xmodem device
addr BUFFER;
int SIZE; \Size of BUFFER in blocks
int I;
begin
for I:= 0, SIZE *256 -1 do
CHOUT(5, BUFFER(I));
end; \XSEND
proc SHOWTITLE(UNIT); \Output the title of the specified unit
int UNIT;
int I, CH;
addr BUFFER, TITLE;
begin
BUFFER:= RESERVE(256);
TITLE:= BUFFER +88; \Offset within block to title
FREAD(UNIT, 12, BUFFER, 1); \Read directory block containing title
for I:= 0, 79 do
begin
CH:= TITLE(I);
if CH>=$20 & CH<$80 then CHOUT(TV, CH)
else I:= 80;
end;
end; \SHOWTITLE
proc DUPDSK; \Duplicate a disk using xmodem
\Inputs: SIZE0, BLOCKS, UNIT, RECEIVING
int BLK, \Starting block of current transfer
SIZE; \Size of current transfer (in blocks)
begin
SIZE:= SIZE0;
BLK:= 0;
if RECEIVING then OPENI(5) else OPENO(5);
TEXT(TV, "DUPING...
");
loop begin
if BLOCKS-BLK < SIZE then \Shrink SIZE if less than a buffer full
SIZE:= BLOCKS -BLK;
if SIZE = 0 then quit; \Quit if none to transfer
if RECEIVING then
[XGET(BUFFER, SIZE);
FWRITE(UNIT, BLK, BUFFER, SIZE)]
else [FREAD(UNIT, BLK, BUFFER, SIZE);
XSEND(BUFFER, SIZE)];
BLK:= BLK + SIZE;
end;
if RECEIVING then
begin
if CHIN(5) then; \Read and discard the EOF
OPENI(5); \Send ACK so sender can finish
end
else CLOSE(5); \Send last buffer (and EOF)
end; \DUPDSK
begin \MAIN
SIZE0:= FREE /256;
SIZE0:= SIZE0 -1; \Leave a little space to work with (for safety)
BUFFER:= RESERVE(SIZE0 *256);
TEXT(TV, "-- XMODEM DISK DUPLICATOR, V1.1 --
BUFFER: "); INTOUT(TV, SIZE0); CRLF(TV);
TEXT(TV, "IS THIS THE RECEIVING COMPUTER (N/Y)? ");
OPENI(KB);
RECEIVING:= (CHIN(KB) ! $20) = ^y;
if RECEIVING then
TEXT(TV, "DESTINATION UNIT NUMBER (0-7)? ")
else TEXT(TV, "SOURCE UNIT NUMBER (0-7)? ");
UNIT:= INTIN(KB);
TEXT(TV, "HOW MANY BLOCKS? ");
BLOCKS:= INTIN(KB);
loop begin
if RECEIVING then
repeat TEXT(TV, "ABOUT TO OVERWRITE UNIT ");
INTOUT(TV, UNIT); CRLF(TV);
SHOWTITLE(UNIT); CRLF(TV);
until VERIFY;
DUPDSK;
TEXT(TV, "DUP ANOTHER DISK (N/Y)? ");
OPENI(KB);
if (CHIN(KB) ! $20) # ^y then quit;
CRLF(TV);
end;
if RECEIVING then OPENI(5); \Send ACK to tell sender we're all done
end; \MAIN
) ! $20) # ^y then quit;
CR